# 缺失值就是由某些原因导致部分数据为空，对于为空的这部分数据我们一般有两种处理方式，一种是删除，即把含有缺失值的数据删除；另外一种是填充，即把缺失的那部分数据用某个值代替。
import pandas as pd
import numpy as np

data = pd.DataFrame([[1, 2, np.nan], [4, np.nan, 6], [7, 8, 9]])
print(data)
# 直接调用 info()方法就会返回每一列的缺失情况
data.info()
print('通过isnull()获取缺失值：')
print(data.loc[1].isnull())
print('获取NaN：')
print(data.loc[1][data.loc[1].isnull()])
print('获取非NaN：')
print(data.loc[1][data.loc[1].notnull()])
# 调用 dropna()方法删除缺失值，dropna()方法默认删除含有缺失值的行，也就是只要某一行有缺失值就把这一行删除。如果想按列为单位删除缺失值，需要传入参数 axis=’columns’。
print('dropna()默认以行为单位删除')
print(data.dropna())
print('dropna()设置以列为单位删除')
print(data.dropna(axis='columns'))
# 删除空白行
data = pd.DataFrame([[np.nan, np.nan, np.nan], [1, 2, 3], [4, np.nan, 5], [np.nan, 6, 7]])
print('全部为空才为空白：')
print(data.dropna(how='all'))
print('只要有空就删除：')
print(data.dropna(how='any'))
# 缺失值补充
print('缺失值补充'.center(20,'='))
print('补充0')
print(data.fillna(0))  # 补充0
print('以行前一个数进行补充')
print(data.ffill())  # 以行前一个数进行补充
print('以行后一个数进行补充')
print(data.bfill())  # 以行后一个数进行补充
print('先按列前一个(如果有)，再按后一个')
print(data.ffill().bfill())  # 先按行前一个(如果有)，再按后一个
print('以列前一个数进行补充')
print(data.ffill(axis=1)) # 以列前一个数进行补充
print('以列后一个数进行补充')
print(data.bfill(axis=1)) # 以列前一个数进行补充
print('按列平均值填充')
print(data.fillna(data.mean()))
